package com.lagou.base;

import com.alibaba.fastjson.JSON;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;

public class BaseServlet extends HttpServlet {


    /**
     * doGet()方法作为调度器 控制器,根据请求的功能不同,调用对应的方法
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、 获取方法参数名
        //String methodName = request.getParameter("methodName");


        //1、获取post请求的Content-Type类型
        //2、判断post请求是否为 json格式
        //3、如果是json格式的  我们就调用下面写好的getPostJSON方法
        //4、将获取到的json字符串转换成map集合对象
        //5、从map集合中获取调用方方法
        //6、将Map保存到request域对象中 (流只能使用一次)

        //1、 获取方法参数名
        //String methodName = request.getParameter("methodName");
        String methodName = null;

        //2.获取POST请求的 Content-Type类型
        String contentType = request.getHeader("Content-Type");
        //3.判断传递的数据是不是JSON格式
        if ("application/json;charset=utf-8".equalsIgnoreCase(contentType)) {
            //是JOSN格式 调用getPostJSON
            String postJSON = getPostJSON(request);
            //将JSON格式的字符串转化为map
            Map<String, Object> map = JSON.parseObject(postJSON, Map.class);
            //从map集合中获取 methodName
            methodName = (String) map.get("methodName");
            //将获取到的数据,保存到request域对象中
            request.setAttribute("map", map);
        } else {
            methodName = request.getParameter("methodName");
        }

        try {
            //获取字节码文件
            Class c = this.getClass();
            //获取字节码文件中的方法
            Method method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //调用里面的方法
            method.invoke(this, request, response);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("请求的方法不存在!");
        }
    }




    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }


    /**
     * POST请求格式为 application/json;charset=utf-8
     * 在这个方法中我们使用流的方式,获取到POST请求的数据
     * */

    public String getPostJSON(HttpServletRequest request){
        try {
            //1、获取流对象
            BufferedReader reader = request.getReader();
            //2、创建一个stringBuffer对象进行数据的存储
            StringBuffer sb = new StringBuffer();
            String line = null;
            //3、循环获取里面的数据
            while((line=reader.readLine())!=null){
                sb.append(line);
            }
            //4、返回方法名称
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
